﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Entidades;
using LogicaNegocio;

namespace PresentacionEscritorio
{
    public partial class frmRegistrarInstitución : Form, IOpcion
    {
        private string opElegida;
        public int IdInstitucionRecibida { get; set; }
        private int idConvenioInstitucion; //es el id del convenio vigente para la institucion que estoy mostrando en el form

        public frmRegistrarInstitución()
        {
            InitializeComponent();
        }

        public void setOpcion(string op)
        {
            opElegida = op;
        }

        public string getOpcion()
        {
            return opElegida;
        }

        private void frmRegistrarInstitución_Load(object sender, EventArgs e)
        {
            cargarLocalidades();
            cargarFormSegunOpcion();
            dtpFechaHasta.Checked = false;
            btnLimpiar.Visible = false;
            btnImprimirConvenio.Visible = false;
            chkActualizarConvenio.Visible = false;
        }

        private void cargarFormSegunOpcion()
        {
            switch (opElegida)
            {
                case Opcion.OpRegistrar:
                    break;
                case Opcion.OpConsultar:
                    this.Text = "Consultar Institución - TodoSalud";
                    lblTitulo.Text = "Consultar Institución";
                    cargarInstitucion();
                    deshabilitarCampos();
                    break;
                case Opcion.OpModificar:
                    this.Text = "Modificar Institución - TodoSalud";
                    lblTitulo.Text = "Modificar Institución";
                    cargarInstitucion();
                    panel2.Enabled = false;
                    break;
                case Opcion.OpDarBaja:
                    this.Text = "Dar de baja Institución - TodoSalud";
                    lblTitulo.Text = "Registrar baja Institución";
                    cargarInstitucion();
                    deshabilitarCampos();
                    break;
                case "convenio":
                    this.Text = "Datos convenio Institución - TodoSalud";
                    lblTitulo.Text = "Establecer Convenio Institución";
                    cargarInstitucion();
                    chkActualizarConvenio.Visible = true;
                    panel1.Enabled = false;
                    break;
                default:
                    break;
            }
        }

        private void deshabilitarCampos()
        {
            txtNombreInstitución.Enabled = false;
            txtNombreResponsable.Enabled = false;
            txtApellidoResponsable.Enabled = false;
            txtTelefono.Enabled = false;
            txtCorreoElectrónico.Enabled = false;
            txtCalle.Enabled = false;
            txtNumeroCalle.Enabled = false;
            txtPiso.Enabled = false;
            txtDepartamento.Enabled = false;
            txtCodigoPostal.Enabled = false;
            cmbLocalidad.Enabled = false;
            cmbBarrio.Enabled = false;
            dtpFechaDesde.Enabled = false;
            dtpFechaHasta.Enabled = false;
            txtMontoCuota.Enabled = false;
            txtCantPersonasCubiertas.Enabled = false;
            txtObservaciones.Enabled = false;
        }

        private void cargarInstitucion()
        {
            GestorInstituciones gi = new GestorInstituciones();
            GestorBarrio gb = new GestorBarrio();
            Institucion institucionSolicitada = gi.obtenerInstitucion(IdInstitucionRecibida);
            ConvenioInstitucion convenioInstSolicitada = gi.obtenerConvenioDeInstitucion(IdInstitucionRecibida);
            //Barrio barrioInstitucion = 

            idConvenioInstitucion = convenioInstSolicitada.IdConvenioInstitucion;

            txtNombreInstitución.Text = institucionSolicitada.NombreInstitucion;
            txtNombreResponsable.Text = institucionSolicitada.NombreResponsable;
            txtApellidoResponsable.Text = institucionSolicitada.ApellidoResponsable;
            txtTelefono.Text = institucionSolicitada.Telefono.ToString();
            txtCorreoElectrónico.Text = null;
            txtCalle.Text = institucionSolicitada.Domicilio.calle;
            txtNumeroCalle.Text = institucionSolicitada.Domicilio.numero.ToString();
            txtPiso.Text = institucionSolicitada.Domicilio.piso.ToString();
            
            txtDepartamento.Text = institucionSolicitada.Domicilio.Departamento;
            txtCodigoPostal.Text = institucionSolicitada.Domicilio.codPostal.ToString();
            //cmbLocalidad.DisplayMember = ;
            //cmbBarrio.SelectedIndex = -1;
            dtpFechaDesde.Value = convenioInstSolicitada.FechaVigenciaDesde;
            if (convenioInstSolicitada.FechaVigenciaHasta != null)
                dtpFechaHasta.Value = convenioInstSolicitada.FechaVigenciaHasta.Value;
            else
                dtpFechaHasta.Checked = false;
            txtMontoCuota.Text = convenioInstSolicitada.MontoMensual.ToString();
            txtCantPersonasCubiertas.Text = convenioInstSolicitada.CantPersonasCubiertas.ToString();
            txtObservaciones.Text = convenioInstSolicitada.Observaciones;

        }

        private void cargarBarrios(int idLocalidad)
        {
            GestorBarrio gb = new GestorBarrio();
            List<Barrio> listBarrios = gb.ObtenerTodos(idLocalidad);
            cmbBarrio.DataSource = listBarrios;
            cmbBarrio.ValueMember = "idBarrio";
            cmbBarrio.DisplayMember = "nombre";
            cmbBarrio.SelectedIndex = -1;
        }

        private void cargarLocalidades()
        {
            GestorLocalidad gl = new GestorLocalidad();
            List<Localidad> listLocalidades = gl.ObtenerTodos();
            cmbLocalidad.DataSource = listLocalidades;
            cmbLocalidad.ValueMember = "idLocalidad";
            cmbLocalidad.DisplayMember = "nombre";
            //cargarBarrios(int.Parse(cmbLocalidad.SelectedValue.ToString()));
            cmbLocalidad.SelectedIndex = -1;
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            switch (opElegida)
            {
                case Opcion.OpRegistrar:
                    registrarNuevaInstitucion();
                    break;
                case Opcion.OpModificar:
                    modificarInstitucion();
                    break;
                case Opcion.OpDarBaja:
                    darBajaInstitucion();
                    break;
                case Opcion.OpConsultar:
                    this.Dispose();
                    break;
                case "convenio":
                    if (chkActualizarConvenio.Checked)
                        actualizarConvenioInstitucion();
                    else
                        this.Dispose();
                    break;
                default:
                    registrarNuevaInstitucion();
                    break;
            }
        }

        private void registrarNuevaInstitucion()
        {
            if (validarDatosInstitucion() && validarDatosConvenio())
            {
                //tomamos los datos
                Institucion institucion = new Institucion();
                institucion.NombreInstitucion = txtNombreInstitución.Text;
                institucion.NombreResponsable = txtNombreResponsable.Text;
                institucion.ApellidoResponsable = txtApellidoResponsable.Text;
                institucion.Telefono = long.Parse(txtTelefono.Text);

                //domicilio
                institucion.Domicilio = new Domicilio();
                institucion.Domicilio.calle = txtCalle.Text;
                institucion.Domicilio.numero = int.Parse(txtNumeroCalle.Text);
                if (string.IsNullOrEmpty(txtPiso.Text))
                    institucion.Domicilio.piso = null;
                else
                    institucion.Domicilio.piso = int.Parse(txtPiso.Text);
                if (string.IsNullOrEmpty(txtDepartamento.Text))
                    institucion.Domicilio.Departamento = null;
                else
                    institucion.Domicilio.Departamento = txtDepartamento.Text;
                if (string.IsNullOrEmpty(txtCodigoPostal.Text))
                    institucion.Domicilio.codPostal = null;
                else
                    institucion.Domicilio.codPostal = int.Parse(txtCodigoPostal.Text);
                institucion.Domicilio.idBarrio = int.Parse(cmbBarrio.SelectedValue.ToString());

                //convenio
                ConvenioInstitucion convenioInst = new ConvenioInstitucion();
                convenioInst.CantPersonasCubiertas = int.Parse(txtCantPersonasCubiertas.Text);
                convenioInst.MontoMensual = float.Parse(txtMontoCuota.Text);
                convenioInst.FechaVigenciaDesde = dtpFechaDesde.Value;
                if (dtpFechaHasta.Enabled)
                    convenioInst.FechaVigenciaHasta = dtpFechaHasta.Value;
                else
                    convenioInst.FechaVigenciaHasta = null;
                if (string.IsNullOrEmpty(txtObservaciones.Text))
                    convenioInst.Observaciones = null;
                else
                    convenioInst.Observaciones = txtObservaciones.Text;

                GestorInstituciones gi = new GestorInstituciones();
                bool res = gi.registrarInstitucion(institucion, convenioInst);
                if (res)
                {
                    MessageBox.Show("Se registró exitosamente la institución", "Mensaje", MessageBoxButtons.OK);
                    btnImprimirConvenio.Visible = true;
                }
                else
                    MessageBox.Show("No se pudo registrar la nueva institución", "Mensaje", MessageBoxButtons.OK);
                btnLimpiar.Visible = true;
                btnImprimirConvenio.Visible = true;
            }
        }

        private void modificarInstitucion()
        {
            if (validarDatosInstitucion())
            {
                //tomamos los datos
                Institucion institucion = new Institucion();
                institucion.IdInstitucion = IdInstitucionRecibida;
                institucion.NombreInstitucion = txtNombreInstitución.Text;
                institucion.NombreResponsable = txtNombreResponsable.Text;
                institucion.ApellidoResponsable = txtApellidoResponsable.Text;
                institucion.Telefono = long.Parse(txtTelefono.Text);

                //domicilio
                institucion.Domicilio = new Domicilio();
                institucion.Domicilio.calle = txtCalle.Text;
                institucion.Domicilio.numero = int.Parse(txtNumeroCalle.Text);
                if (string.IsNullOrEmpty(txtPiso.Text))
                    institucion.Domicilio.piso = null;
                else
                    institucion.Domicilio.piso = int.Parse(txtPiso.Text);
                if (string.IsNullOrEmpty(txtDepartamento.Text))
                    institucion.Domicilio.Departamento = null;
                else
                    institucion.Domicilio.Departamento = txtDepartamento.Text;
                if (string.IsNullOrEmpty(txtCodigoPostal.Text))
                    institucion.Domicilio.codPostal = null;
                else
                    institucion.Domicilio.codPostal = int.Parse(txtCodigoPostal.Text);
                institucion.Domicilio.idBarrio = int.Parse(cmbBarrio.SelectedValue.ToString());

                GestorInstituciones gi = new GestorInstituciones();
                bool res = gi.actualizarDatosInstitucion(institucion);
                if (res)
                {
                    MessageBox.Show("Se modificó exitosamente la institución", "Mensaje", MessageBoxButtons.OK);
                    btnImprimirConvenio.Visible = true;
                }
                else
                    MessageBox.Show("No se pudo modificar la nueva institución", "Mensaje", MessageBoxButtons.OK);
                btnLimpiar.Visible = true;
                btnImprimirConvenio.Visible = true;
            }
        }

        private void darBajaInstitucion()
        {
            DialogResult dr = MessageBox.Show("Seguro que desea dar de baja a la institución?", "Confirmación", MessageBoxButtons.OKCancel);
            if (dr == System.Windows.Forms.DialogResult.OK)
            {
                //registrar la baja
            }
                
        }

        private void actualizarConvenioInstitucion()
        {
            ConvenioInstitucion convenioInst = new ConvenioInstitucion();
            convenioInst.CantPersonasCubiertas = int.Parse(txtCantPersonasCubiertas.Text);
            convenioInst.MontoMensual = float.Parse(txtMontoCuota.Text);
            convenioInst.FechaVigenciaDesde = dtpFechaDesde.Value;
            if (dtpFechaHasta.Enabled)
                convenioInst.FechaVigenciaHasta = dtpFechaHasta.Value;
            else
                convenioInst.FechaVigenciaHasta = null;
            if (string.IsNullOrEmpty(txtObservaciones.Text))
                convenioInst.Observaciones = null;
            else
                convenioInst.Observaciones = txtObservaciones.Text;

            //tomamos la fecha de baja del convenio actual
            DateTime fechaBajaActualConv = DateTime.Now;

            GestorInstituciones gi = new GestorInstituciones();
            bool res = gi.registrarNuevoConvenioInstitucion(convenioInst, fechaBajaActualConv);
            if (res)
            {
                MessageBox.Show("Se registró exitosamente el nuevo convenio", "Mensaje", MessageBoxButtons.OK);
                btnImprimirConvenio.Visible = true;
            }
            else
                MessageBox.Show("No se pudo registrar el nuevo convenio de la institución", "Mensaje", MessageBoxButtons.OK);
            btnLimpiar.Visible = true;
            btnImprimirConvenio.Visible = true;
        }

        private bool validarDatosInstitucion()
        {
            bool res = true; //suponemos que todo "is ok!" jaja
            string error = "";
            if (string.IsNullOrEmpty(txtNombreInstitución.Text))
            {
                error += "El nombre de la institución es requerido \n\r";
                res = false;
            }
            if (string.IsNullOrEmpty(txtNombreResponsable.Text))
            {
                error += "El nombre del responsable es requerido \n\r";
                res = false;
            }
            if (string.IsNullOrEmpty(txtApellidoResponsable.Text))
            {
                error += "El apellido del responsable es requerido \n\r";
                res = false;
            }
            if (string.IsNullOrEmpty(txtNombreInstitución.Text))
            {
                error += "El nombre de la institución es requerido \n\r";
                res = false;
            }
            if (string.IsNullOrEmpty(txtCorreoElectrónico.Text)) //ver si es necesario si o si el correo electronico
            {
                error += "El correo de la institución es requerido \n\r";
                res = false;
            }
            if (string.IsNullOrEmpty(txtTelefono.Text))
            {
                error += "El teléfono es requerido \n\r";
                res = false;
            }
            else
            {
                long nro;
                bool resNro = long.TryParse(txtTelefono.Text, out nro);
                if (!resNro)
                {
                    error += "El teléfono debe ser un valor numérico";
                    res = false;
                }
            }


            //validamos el domicilio
            if (string.IsNullOrEmpty(txtCalle.Text))
            {
                error += "La calle es requerida \n\r";
                res = false;
            }
            if (string.IsNullOrEmpty(txtNumeroCalle.Text))
            {
                error += "La altura de la calle es requerida \n\r";
                res = false;
            }
            else
            {
                int nroC;
                bool resNroC = int.TryParse(txtNumeroCalle.Text, out nroC);
                if (!resNroC)
                {
                    error += "La altura de la calle debe ser un valor numérico \n\r";
                    res = false;
                }
            }
            if (cmbLocalidad.SelectedValue == null)
            {
                error += "Debe seleccionarse localidad \n\r";
                res = false;
            }
            if (cmbBarrio.SelectedValue == null)
            {
                error += "Debe seleccionarse barrio \n\r";
                res = false;
            }
            
            //mostramos mensaje de error
            if (!res)
                MessageBox.Show(error, "Información", MessageBoxButtons.OK);

            return res;
        }

        private bool validarDatosConvenio()
        {
            bool res = true; //suponemos que todo "is ok!" jaja
            string error = "";
            if (dtpFechaHasta.Checked && (dtpFechaHasta.Value <= dtpFechaDesde.Value))
            {
                error += "La fecha de vigencia hasta del convenio debe ser posterior a la fecha desde\n\r";
                res = false;
            }
            if (string.IsNullOrEmpty(txtCantPersonasCubiertas.Text))
            {
                error += "La cantidad de personas cubiertas en el convenio es requerida \n\r";
                res = false;
            }
            else
            {
                int cant;
                bool resCant = int.TryParse(txtCantPersonasCubiertas.Text, out cant);
                if (!resCant)
                {
                    error += "La cantidad de personas debe ser un valor numérico";
                    res = false;
                }
            }
            if (string.IsNullOrEmpty(txtMontoCuota.Text))
            {
                error += "El valor de la cuota mensual es requerido \n\r";
                res = false;
            }
            else
            {
                float monto;
                bool resMonto = float.TryParse(txtMontoCuota.Text, out monto);
                if (!resMonto)
                {
                    error += "El monto de la cuota mensual debe ser un valor numérico";
                    res = false;
                }
            }

            //mostramos los errores que haya
            if (!res)
                MessageBox.Show(error, "Información", MessageBoxButtons.OK);

            return res;
        }

        private void cmbLocalidad_SelectionChangeCommitted(object sender, EventArgs e)
        {
            cargarBarrios(int.Parse(cmbLocalidad.SelectedValue.ToString()));
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            txtNombreInstitución.Text = null;
            txtNombreResponsable.Text = null;
            txtApellidoResponsable.Text = null;
            txtTelefono.Text = null;
            txtCorreoElectrónico.Text = null;
            txtCalle.Text = null;
            txtNumeroCalle.Text = null;
            txtPiso.Text = null;
            txtDepartamento.Text = null;
            txtCodigoPostal.Text = null;
            cmbLocalidad.SelectedIndex = -1;
            cmbBarrio.SelectedIndex = -1;
            dtpFechaDesde.Value = DateTime.Now;
            dtpFechaHasta.Value = DateTime.Now;
            dtpFechaHasta.Checked = false;
            txtMontoCuota.Text = null;
            txtCantPersonasCubiertas.Text = null;
            txtObservaciones.Text = null;
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

    }
}
